package com.ruan.config;

import com.ruan.quartz.MonthCountQuartz;
import com.ruan.quartz.OnDutyQuartz;
import com.ruan.quartz.SalaryQuartz;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {


    //每天的出勤定时任务(把不打卡的都员工的这一天的状态都标记为“旷工”，周六日标记为“休息”)
    @Bean//表示将返回的对象注册为Spring容器的一个Bean。
    public JobDetail JobDetailForOnDuty(){

        //调用JobBuilder.newJob方法创建JobBuilder对象，
        // 传入OnDutyQuartz.class作为要执行的工作。
        return JobBuilder.newJob(OnDutyQuartz.class) //绑定要执行的工作(quartz的OnDutyQuartz类)
                .storeDurably() // 持久化操作(即使没有Trigger与之关联，
                // 也不会从Scheduler中删除该JobDetail。)
                .build();//调用build方法构建JobDetail对象并返回。
    }

    @Bean
    public Trigger JobTriggerForOnDuty(){
        // 创建一个Cron表达式的ScheduleBuilder对象，表示每天晚上23:50执行任务。
        ScheduleBuilder schedBuilder =
                CronScheduleBuilder.cronSchedule("0 50 23 * * ?");//0/5 * * * * ?//0 50 23 * * ?
//调用TriggerBuilder.newTrigger方法创建TriggerBuilder对象，
// 绑定对应的JobDetailForOnDuty工作明细，指定触发条件为指定的Cron表达式schedBuilder
        return TriggerBuilder.newTrigger()
                .forJob(JobDetailForOnDuty()) // 绑定对应的工作明细
                .withSchedule(schedBuilder)
                .build();//调用build方法构建Trigger对象并返回
    }


    //每月的月统计定时任务
    @Bean
    public JobDetail JobDetailForMonthCount(){

        //调用JobBuilder.newJob方法创建JobBuilder对象，
        // 传入MonthCountQuartz.class作为要执行的工作。
        return JobBuilder.newJob(MonthCountQuartz.class) //绑定要执行的工作MonthCountQuartz类
                .storeDurably() // 持久化操作(即使没有Trigger与之关联，
                // 也不会从Scheduler中删除该JobDetail。)
                .build();
    }

    @Bean
    public Trigger JobTriggerForMonthCount(){

        // 每月的最后一天晚上23:50执行
        ScheduleBuilder schedBuilder =
                CronScheduleBuilder.cronSchedule("0 50 23 L * ?");//0/5 * * * * ?//0 50 23 L * ?
        //L表示每月的最后一天

        return TriggerBuilder.newTrigger()
                .forJob(JobDetailForMonthCount()) // 绑定对应的JobDetailForMonthCount工作明细
                .withSchedule(schedBuilder)//指定触发条件为上面指定的Cron表达式schedBuilder。
                .build();
    }


    //每月的工资计算定时任务
    @Bean
    public JobDetail JobDetailForSalary(){
//使用JobBuilder来创建一个新的作业（Job），
// 并指定要执行的工作类（这里是SalaryQuartz类）
        return JobBuilder
                .newJob(SalaryQuartz.class) //要执行的工作是。。。
                .storeDurably() // 持久化操作
                .build();
//调用storeDurably()方法表示将作业持久化，即使没有触发器与之关联，
// 作业也会一直存在于Quartz的作业存储中。最后通过build()方法构建并返回JobDetail对象。
    }

    //作用是创建一个触发器，用于触发之前定义的作业（JobDetailForMonthCount()）的执行，
    // 按照每月第9号晚上23:50的规则进行调度。在Quartz中，触发器用于定义作业的触发条件和调度规则。
    @Bean
    public Trigger JobTriggerForSalary(){

        //调度器
        // 每月的9号晚上23:50执行
        ScheduleBuilder schedBuilder =
                CronScheduleBuilder.cronSchedule("0 50 23 9 * ?");//0/8 * * * * ?//("0 50 23 9 * ?")
//使用Cron表达式来定义触发器的调度规则，这里的表达式表示每个月的第9号晚上23:50执行作业
        //秒 分 时 号 月
        return TriggerBuilder
                .newTrigger()
                .forJob(JobDetailForSalary()) // 绑定对应的工作明细JobDetailForMonthCount()
                .withSchedule(schedBuilder)
                .build();
//使用TriggerBuilder来创建一个新的触发器（Trigger），
// 将其绑定到之前定义的作业明细（JobDetailForMonthCount()），
// 并指定触发器的调度规则为上面定义的Cron表达式。最后通过build()方法构建并返回Trigger对象。
    }
}
